package types

// ApiRequest 大模型请求参数
type ApiRequest struct {
	Model               string                 `json:"model,omitempty"`                 // 模型
	Temperature         float32                `json:"temperature"`                     // 采样温度
	MaxTokens           int                    `json:"max_tokens,omitempty"`            // 控制生成的响应的最大 tokens 数量
	MaxCompletionTokens int                    `json:"max_completion_tokens,omitempty"` // 兼容 GPT 01 模型
	Stream              bool                   `json:"stream,omitempty"`                // 是否流式输出
	Messages            []interface{}          `json:"messages,omitempty"`              // 消息切片
	Tools               []Tool                 `json:"tools,omitempty"`                 // 模型可以调用的工具
	Functions           []interface{}          `json:"functions,omitempty"`             // 兼容中转平台
	ResponseFormat      interface{}            `json:"response_format,omitempty"`       // 响应格式
	ToolChoice          string                 `json:"tool_choice,omitempty"`           // 用于控制模型选择调用哪个函数的方式
	Input               map[string]interface{} `json:"input,omitempty"`                 //兼容阿里通义千问
	Parameters          map[string]interface{} `json:"parameters,omitempty"`            //兼容阿里通义千问
}

// Message 消息内容
type Message struct {
	Role    string `json:"role"`    // 消息角色
	Content string `json:"content"` // 消息内容
}

type ApiResponse struct {
	Choices []ChoiceItem `json:"choices"`
}

// API 响应实体
type ChoiceItem struct {
	Delta        Delta  `json:"delta"`
	FinishReason string `json:"finish_reason"`
}

// Delta 模型增量返回的文本信息，大模型流式输出包含的有该字段
type Delta struct {
	Role         string      `json:"role"` // 当前对话角色，默认为’assistant’（模型）
	Name         string      `json:"name"`
	Content      interface{} `json:"content"` // 当前对话内容。命中函数时为null，否则返回模型推理结果。
	ToolCalls    []ToolCall  `json:"tool_calls,omitempty"`
	FunctionCall struct {
		Name      string `json:"name,omitempty"`
		Arguments string `json:"arguments,omitempty"`
	} `json:"function_call,omitempty"`
}

// ChatSession 聊天会话对象
type ChatSession struct {
	UserId   uint      `json:"user_id"`   // 用户Id
	ClientIP string    `json:"client_ip"` // 客户端IP
	ChatId   string    `json:"chat_id"`   // 客户端聊天会话ID，多会话模式专用字段
	Model    ChatModel `json:"model"`     // GPT 模型
	Start    int64     `json:"start"`     // 开始请求时间戳
	Tools    []int     `json:"tools"`     // 工具函数列表
	Stream   bool      `json:"stream"`    // 是否采用流式输出
}

type ChatModel struct {
	Id          uint    `json:"id"`
	Name        string  `json:"name"`        // 模型名称
	Value       string  `json:"value"`       // 模型值
	Power       int     `json:"power"`       // 模型消耗的算力
	MaxTokens   int     `json:"max_tokens"`  // 最大响应长度
	MaxContext  int     `json:"max_context"` // 最大上下文长度
	Temperature float32 `json:"temperature"` // 模型温度
	KeyId       int     `json:"key_id"`      // 绑定的API KEY
}

type ApiError struct {
	Error struct {
		Message string
		Type    string
		Param   interface{}
		Code    string
	}
}

const PromptMsg = "prompt" // prompt message
const ReplyMsg = "reply"   // reply message

// PowerType 算力日志类型
type PowerType int

const (
	PowerRecharge = PowerType(1) // 充值
	PowerConsume  = PowerType(2) // 消费
	PowerRefund   = PowerType(3) // 任务（SD,MJ）执行失败，退款
	PowerInvite   = PowerType(4) // 邀请奖励
	PowerRedeem   = PowerType(5) // 众筹
	PowerGift     = PowerType(6) // 系统赠送
)

func (t PowerType) String() string {
	switch t {
	case PowerRecharge:
		return "充值"
	case PowerConsume:
		return "消费"
	case PowerRefund:
		return "退款"
	case PowerRedeem:
		return "兑换"
	case PowerGift:
		return "赠送"
	case PowerInvite:
		return "邀请"
	}
	return "其它"
}

type PowerMart int

const (
	PowerSub = PowerMart(0)
	PowerAdd = PowerMart(1)
)
